import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import os
from datetime import datetime

# 读取Excel文件
file_path = 'dataset/三大产业投资额累计增长.xlsx'
sheet_name = '月度数据'
df = pd.read_excel(file_path, sheet_name=sheet_name, header=2)  # 跳过前两行

# 提取指标名称（排除非数据行）
indicators = df['指标'].dropna().tolist()

# 提取日期列（排除空列）
dates = [col for col in df.columns[1:] if 'Unnamed' not in str(col)]
date_series = pd.to_datetime([date.replace('年', '-').replace('月', '') for date in dates])

# 创建日期范围（从最早日期到最晚日期）
start_date = date_series.min()
end_date = date_series.max()
all_dates = pd.date_range(start=start_date, end=end_date, freq='D')

# 创建空的DataFrame用于存储所有指标的每日数据
full_daily_data = pd.DataFrame({'日期': all_dates})

# 设置绘图风格
# plt.style.use('seaborn')
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

# 创建图形保存目录
output_dir = '数据图表/三大产业投资增长图表'
if not os.path.exists(output_dir):
    os.makedirs(output_dir)

# 对每个指标进行插值处理和可视化
for indicator in indicators:
    # 提取当前指标的数据
    indicator_row = df[df['指标'] == indicator].index[0]
    indicator_data = df.iloc[indicator_row, 1:len(dates)+1].astype(float)
    
    # 创建临时DataFrame
    temp_df = pd.DataFrame({
        '日期': date_series,
        indicator: indicator_data.values
    })
    
    # 合并到完整日期范围
    temp_df = pd.merge(full_daily_data[['日期']], temp_df, on='日期', how='left')
    
    # 线性插值（限制只在已知数据范围内插值）
    known_dates = temp_df[indicator].notna()
    temp_df.loc[known_dates, '原始数据'] = temp_df.loc[known_dates, indicator]
    temp_df[indicator] = temp_df[indicator].interpolate(method='linear')
    
    # 填充首尾可能存在的NaN值（仅向前/向后填充）
    temp_df[indicator] = temp_df[indicator].fillna(method='bfill').fillna(method='ffill')
    
    # 添加到完整数据集
    full_daily_data = pd.merge(full_daily_data, temp_df[['日期', indicator]], on='日期', how='left')
    
    # 绘制折线图
    plt.figure(figsize=(14, 7))
    
    # 绘制插值后的曲线
    plt.plot(temp_df['日期'], temp_df[indicator], 
             color='#1f77b4', linestyle='-', linewidth=2, label='插值数据')
    
    # 标记原始数据点
    plt.scatter(temp_df[temp_df['原始数据'].notna()]['日期'], 
                temp_df[temp_df['原始数据'].notna()][indicator],
                color='#ff7f0e', s=80, label='原始数据', zorder=5)
    
    # 设置图表标题和标签
    plt.title(f'{indicator} 每日数据趋势 (2016-2025)', fontsize=16, pad=20)
    plt.xlabel('日期', fontsize=12)
    plt.ylabel('增长(%)', fontsize=12)
    
    # 设置x轴日期格式
    ax = plt.gca()
    ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
    ax.xaxis.set_major_locator(mdates.MonthLocator(interval=4))
    plt.gcf().autofmt_xdate(rotation=45)
    
    # 添加零线参考
    plt.axhline(y=0, color='gray', linestyle='--', linewidth=1, alpha=0.5)
    
    # 添加网格
    plt.grid(True, linestyle='--', alpha=0.6)
    
    # 添加图例
    plt.legend(fontsize=12, loc='upper right')
    
    # 调整布局
    plt.tight_layout()
    
    # 保存图表
    safe_indicator = indicator.replace('/', '_').replace('(', '').replace(')', '')
    chart_path = f'{output_dir}/{safe_indicator}_趋势图.png'
    plt.savefig(chart_path, bbox_inches='tight', dpi=300)
    plt.close()
    
    print(f'已生成 {indicator} 的图表: {chart_path}')

# 保存所有指标的每日数据到CSV
output_file = 'dataset_csv/三大产业投资每日增长数据.csv'
full_daily_data.to_csv(output_file, index=False, encoding='utf-8-sig')

print(f'\n所有指标的每日数据已保存到 {output_file}')
print('处理完成！')